package org.dicr.sys.linux;

import java.io.*;

/**
 * Информация о процессоре.
 * <P>
 * Информация о процессоре является статической и не меняется со временем.
 * </P>
 * <P>
 * Старшинство процессора приблизительно определяется в виде: <BLOCKQUOTE><CODE>family.model.stepping</CODE></BLOCKQUOTE>
 * </P>
 * <P>
 * Производительность процессора определяет параметр: <BLOCKQUOTE><CODE>bogomips</CODE> - число операций в секунду.</BLOCKQUOTE>
 * </P>
 * 
 * @author Igor A Tarasov &lt;java@dicr.org&gt;
 * @version 1.0
 * @todo количество процессоров в системе.
 * @todo размерность в простых единицах без K,M,...
 * @see CPUInfo
 */
public class CPUInfoData implements Serializable {
	/** Serial ID */
	private static final long serialVersionUID = 1L;

	private final String name;

	private final String vendor;

	private final int family;

	private final int model;

	private final int stepping;

	private final long freq;

	private final long bogomips;

	private final int cacheSize;

	/**
	 * Constructor
	 * 
	 * @param theName
	 * @param theVendor
	 * @param theFamily
	 * @param theModel
	 * @param theStepping
	 * @param theFreq
	 * @param theBogomips
	 * @param theCacheSize
	 */
	protected CPUInfoData(final String theName, final String theVendor, final int theFamily, final int theModel, final int theStepping, final long theFreq, final long theBogomips, final int theCacheSize) {
		super();
		if (theName == null) throw new IllegalArgumentException("null model name");
		this.name = theName.toString();
		this.vendor = theVendor;
		if (theFamily < 0) throw new IllegalArgumentException("family: " + theFamily);
		this.family = theFamily;
		if (theModel < 0) throw new IllegalArgumentException("model: " + theModel);
		this.model = theModel;
		if (theStepping < 0) throw new IllegalArgumentException("stepping: " + theStepping);
		this.stepping = theStepping;
		if (theFreq < 0) throw new IllegalArgumentException("frequence: " + theFreq);
		this.freq = theFreq;
		if (theBogomips < 0) throw new IllegalArgumentException("bogomips: " + theBogomips);
		this.bogomips = theBogomips;
		if (theCacheSize < 0) throw new IllegalMonitorStateException("cacheSize: " + theCacheSize);
		this.cacheSize = theCacheSize;
	}

	/**
	 * Возвращает число операций секунду.
	 * 
	 * @return число операций в секунду.
	 */
	public long getBogomips() {
		return this.bogomips;
	}

	/**
	 * Возвращает размер кэша.
	 * 
	 * @return размер кэша, byte
	 */
	public int getCacheSize() {
		return this.cacheSize;
	}

	/**
	 * Возвращает семейство.
	 * 
	 * @return номер семейства.
	 */
	public int getFamily() {
		return this.family;
	}

	/**
	 * Возвращает частоту.
	 * 
	 * @return частота, Hz
	 */
	public long getFreq() {
		return this.freq;
	}

	/**
	 * Возвращает модель.
	 * 
	 * @return номер модели.
	 */
	public int getModel() {
		return this.model;
	}

	/**
	 * Возвращает название модели.
	 * 
	 * @return название модели.
	 */
	public String getName() {
		return this.name;
	}

	/**
	 * Возвращает Stepping.
	 * 
	 * @return stepping.
	 */
	public int getStepping() {
		return this.stepping;
	}

	/**
	 * Возвращает производителя.
	 * 
	 * @return производитель или null
	 */
	public String getVendor() {
		return this.vendor;
	}

	/**
	 * Переводит в строку.
	 * 
	 * @return строковое представление.
	 */
	@Override public String toString() {
		return "CPUInfoData[" + this.name + "]";
	}
}
